home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Slider.C < prev    next >
C/C++ Source or Header  |  1992-06-30  |  5KB  |  242 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "Slider.h"
  6.  
  7. #include "Class.h"
  8. #include "Look.h"
  9.  
  10. //---- ThumbMover ------------------------------------------------------------
  11.  
  12. class ThumbMover: public Command {
  13.     Point thumborigin;
  14.     Slider *slider;
  15. public:
  16.     ThumbMover(Point, Slider*);
  17.     Command *TrackMouse(TrackPhase, Point, Point, Point);
  18.     void TrackFeedback(Point, Point, bool)
  19.     { /* indirect feedback */ }
  20. };
  21.  
  22. ThumbMover::ThumbMover(Point to, Slider *sl) : Command(cIdNone)
  23. {
  24.     slider= sl;
  25.     thumborigin= to;
  26. }
  27.  
  28. Command *ThumbMover::TrackMouse(TrackPhase atp, Point ap, Point, Point np)
  29. {
  30.     if (atp == eTrackRelease)
  31.     return gNoChanges;
  32.     if (atp == eTrackMove)
  33.     slider->MoveThumb(thumborigin + (np - ap));
  34.     return this;
  35. }
  36.  
  37. //---- Thumb -------------------------------------------------------------------
  38.  
  39. NewMetaImpl0(Thumb,VObject);
  40.  
  41. Thumb::Thumb(Slider *sl, Direction d) : VObject(eSliderThumb)
  42. {
  43.     slider= sl;
  44.     dir= d;
  45. }
  46.  
  47. void Thumb::Draw(Rectangle)
  48. {
  49.     gLook->ScaleThumbLayout(dir)->Adorn(this, contentRect);
  50. }
  51.  
  52. Metric Thumb::GetMinSize()
  53. {
  54.     return gLook->ScaleThumbLayout(dir)->GetMinSize(this);
  55. }
  56.  
  57. Command *Thumb::DoLeftButtonDownCommand(Point, Token, int)
  58. {
  59.     return new ThumbMover(GetOrigin(), slider);
  60. }
  61.  
  62. GrCursor Thumb::GetCursor(Point)
  63. {
  64.     return (dir == eVert) ? eCrsUpDownArrow : eCrsLeftRightArrow;
  65. }
  66.  
  67. //---- Slider ------------------------------------------------------------------
  68.  
  69. NewMetaImpl(Slider,CompositeVObject, (TP(thumb), TE(dir), TB(feedback),
  70.                 T(minVal), T(maxVal), T(currVal), T(bubbleSize)));
  71.  
  72. Slider::Slider(int id, Direction d, bool fb) : CompositeVObject(id, (Collection*) 0)
  73. {
  74.     dir= d;
  75.     currVal= minVal= gPoint0;
  76.     maxVal= 100;
  77.     bubbleSize= gPoint0;
  78.     feedback= fb;
  79. }
  80.  
  81. Thumb *Slider::MakeThumb()
  82. {
  83.     return new Thumb(this, dir);
  84. }
  85.  
  86. void Slider::SetContainer(VObject *v)
  87. {
  88.     if (thumb == 0)
  89.     Add(thumb= MakeThumb());
  90.     CompositeVObject::SetContainer(v);
  91. }
  92.  
  93. void Slider::SetVal(Point v, bool redraw)
  94. {
  95.     v= Range(minVal, maxVal, v);
  96.     if (currVal != v) {
  97.     currVal= v;
  98.     Update(redraw);
  99.     }
  100. }
  101.  
  102. void Slider::SetMax(Point v, bool redraw)
  103. {
  104.     if (v != maxVal) {
  105.     maxVal= v;
  106.     currVal= Range(minVal, maxVal, currVal);
  107.     Update(redraw);
  108.     }
  109. }
  110.  
  111. void Slider::SetMin(Point v, bool redraw)
  112. {
  113.     if (v != minVal) {
  114.     minVal= v;
  115.     currVal= Range(minVal, maxVal, currVal);
  116.     Update(redraw);
  117.     }
  118. }
  119.  
  120. void Slider::SetThumbRange(Point s, bool redraw)
  121. {
  122.     if (bubbleSize != s) {
  123.     bubbleSize= s;
  124.     Update(redraw);
  125.     }
  126. }
  127.  
  128. void Slider::SetOrigin(Point at)
  129. {
  130.     VObject::SetOrigin(at);
  131.     Update(FALSE);
  132. }
  133.  
  134. Metric Slider::GetMinSize()
  135. {
  136.     if (thumb == 0)
  137.     Add(thumb= MakeThumb());
  138.     return gLook->ScaleLayout()->GetMinSize(this);
  139. }
  140.  
  141. void Slider::Update(bool redraw)
  142. {
  143.     Point e= GetExtent(),
  144.       s= Scale(bubbleSize, e, maxVal);
  145.     Rectangle b;
  146.     if (thumb == 0)
  147.     Add(thumb= MakeThumb());
  148.     b.extent= Range(thumb->GetMinSize().extent, e, s);
  149.     b.origin= GetOrigin() + Scale(currVal, e-b.extent, maxVal-bubbleSize);
  150.     if (thumb->contentRect != b)
  151.     thumb->SetContentRect(b, redraw);
  152. }
  153.  
  154. void Slider::MoveThumb(Point pos)
  155. {
  156.     Point val= Scale(pos-GetOrigin(), maxVal-bubbleSize, GetExtent()-thumb->GetExtent());
  157.     val= Range(minVal, maxVal, val);
  158.     if (feedback)
  159.     SetVal(val, TRUE);
  160.     Control(GetId(), eSliderThumb, &val);
  161. }
  162.  
  163. void Slider::Draw(Rectangle r)
  164. {
  165.     gLook->ScaleLayout()->Adorn(this, r, 0);
  166.     CompositeVObject::Draw(r);
  167. }
  168.  
  169. int Slider::Where(Point lp)
  170. {
  171.     Rectangle r= thumb->contentRect;
  172.     
  173.     if (lp.x >= r.NW().x && lp.x <= r.NE().x) {
  174.     if (lp.y < r.origin.y)
  175.         return 1;
  176.     return 2;
  177.     }
  178.     if (lp.y >= r.NW().y && lp.y <= r.SW().y) {
  179.     if (lp.x < r.origin.x)
  180.         return 3;
  181.     return 4;
  182.     }
  183.     return 0;
  184. }
  185.  
  186. Command *Slider::DoLeftButtonDownCommand(Point lp, Token, int)
  187. {
  188.     switch (Where(lp)) {
  189.     case 1:
  190.     case 3:
  191.     return new PagerCommand(this, eSliderPageUpLeft);
  192.     case 2:
  193.     case 4:
  194.     return new PagerCommand(this, eSliderPageDownRight);
  195.     }
  196.     return gNoChanges;
  197. }
  198.  
  199. GrCursor Slider::GetCursor(Point lp)
  200. {
  201.     switch (Where(lp)) {
  202.     case 1:
  203.     return eCrsUpArrow;
  204.     case 2:
  205.     return eCrsDownArrow;
  206.     case 3:
  207.     return eCrsLeftArrow;
  208.     case 4:
  209.     return eCrsRightArrow;
  210.     }
  211.     return VObject::GetCursor(lp);
  212. }
  213.  
  214. //---- PagerCommand ------------------------------------------------------------
  215.  
  216. PagerCommand::PagerCommand(Slider* s, int p) : Command("pager", eCmdTypeNoChange)
  217. {
  218.     slider= s;
  219.     part= p;
  220.     SetFlag(eCmdIdleEvents);
  221. }
  222.  
  223. void PagerCommand::TrackFeedback(Point, Point, bool)
  224. {
  225. }
  226.  
  227. Command *PagerCommand::TrackMouse(TrackPhase atp, Point, Point, Point np)
  228. {
  229.     switch (atp) {
  230.     case eTrackPress:
  231.     case eTrackIdle:
  232.     if (slider->ContainsPoint(np))
  233.         slider->Control(slider->GetId(), part, (void*)0);
  234.     break;
  235.     case eTrackRelease:
  236.     return gNoChanges;
  237.     default:
  238.     break;
  239.     }
  240.     return this;
  241. }
  242.